package com.sigetdriver.service;

import java.util.Calendar;
import java.util.HashMap;
import java.util.Timer;
import java.util.TimerTask;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.location.Location;
import android.os.AsyncTask;
import android.os.IBinder;
import android.util.Log;
import com.sigetdriver.util.Helper_GPS_Tracker;
import com.sigetdriver.util.Util_SharedPreferences;
import com.sigetdriver.ServerConstants;
import com.sigetdriver.ServicioWorkingSet;
import com.sigetdriver.util.SigetDriverUtil;

public class TrakingService extends Service {

	private static final String TAG = TrakingService.class.getSimpleName();
	private final String LONTITUD = "longitud";
	private final String LATITUD = "latitud";
	private final String TIME = "time";
	private static Timer timerUbicacion ;
	Location location;
	private Context context;
	private Helper_GPS_Tracker gps;
	private SharedPreferences prefers;
	private Util_SharedPreferences MyPref;
	String latitud_pref;
	String longitud_pref;
	String tiempo_pref;

	int variable;

	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}

	@Override
	public void onCreate() {
		System.out.println("---TRACKING SERVICE---");
		System.out.println("---[INICIO]---");
		context = getApplicationContext();
		gps = new Helper_GPS_Tracker(context);
		MyPref = new  Util_SharedPreferences(context);
		Log.i("STATUS", "Entro al servicio");
		
		
		
		Calendar calendario = Calendar.getInstance();

		int hora = calendario.get(Calendar.HOUR);
		int min = calendario.get(Calendar.MINUTE);
		int sec = calendario.get(Calendar.SECOND);

		int tiempo = (hora * 3600) + (min * 60) + sec;
		
		
		gps.getLocation();
		HashMap<String, String> map = new HashMap<String, String>();
		map.put("latitud", String.valueOf(gps.getLatitude()));
		map.put("longitud", String.valueOf(gps.getLongitude()));
		map.put("time", String.valueOf(tiempo));
		
		MyPref.storeMyCustomPreferences(map, 
		Util_SharedPreferences.MySHAPRE_TRACKING_SERVICE);
		
		
		enviarUbicacion(gps.getLatitude(), gps.getLongitude());
		updatePreferences(gps.getLatitude(), gps.getLongitude(), tiempo);
		iniciarTimerUbicacion();
	}

	private void iniciarTimerUbicacion() {
	    timerUbicacion = new Timer();
		timerUbicacion.schedule(new taskUbicacion(), 1 * 1000, 1 * 1000);
	}

	
	public static void stopSendPositions(){
		try {
			timerUbicacion.cancel();
		} catch (Exception e) {
			Log.e(TAG, "No se pudo detener el servicio");
		}
		
	}
	
	
	private class taskUbicacion extends TimerTask {
		@Override
		public void run() {
			getLocation();
		}
	}

	private void getLocation() {

		Calendar calendario = Calendar.getInstance();

		int hora = calendario.get(Calendar.HOUR);
		int min = calendario.get(Calendar.MINUTE);
		int sec = calendario.get(Calendar.SECOND);

		int tiempo = (hora * 3600) + (min * 60) + sec;

		gps.getLocation();
		
		latitud_pref = MyPref.getAnyValueToMyCustomPreferences(
				Util_SharedPreferences.MySHAPRE_TRACKING_SERVICE, LATITUD);
		
		longitud_pref = MyPref.getAnyValueToMyCustomPreferences(
				Util_SharedPreferences.MySHAPRE_TRACKING_SERVICE, LONTITUD);
		
		tiempo_pref = MyPref.getAnyValueToMyCustomPreferences(
				Util_SharedPreferences.MySHAPRE_TRACKING_SERVICE, TIME);
		
		
		
//		latitud_pref = prefers.getString("latitud_pref",
//				String.valueOf(gps.getLatitude()));
//		longitud_pref = prefers.getString("longitud_pref",
//				String.valueOf(gps.getLongitude()));
//		tiempo_pref = prefers.getString("tiempo_pref", String.valueOf(tiempo));

		Double Lat1 = Double.parseDouble(latitud_pref);
		Double Lon1 = Double.parseDouble(longitud_pref);
		Double Lat2 = gps.getLatitude();
		Double Lon2 = gps.getLongitude();

		Double Lat1_Rad = Lat1 * 3.1416 / 180;
		Double Lat2_Rad = Lat2 * 3.1416 / 180;
		Double Lon1_Rad = Lon1 * 3.1416 / 180;
		Double Lon2_Rad = Lon2 * 3.1416 / 180;

		Double Sin_Lat1 = Math.sin(Lat1_Rad);
		Double Sin_Lat2 = Math.sin(Lat2_Rad);
		Double Cos_Lat1 = Math.cos(Lat1_Rad);
		Double Cos_Lat2 = Math.cos(Lat2_Rad);
		Double Cos_Lon2Lon1 = Math.cos(Lon2_Rad - Lon1_Rad);

		Double difDistancia = 6378 * 1000 * (Math.acos((Sin_Lat1 * Sin_Lat2)
				+ (Cos_Lat1 * Cos_Lat2 * Cos_Lon2Lon1)));
		Double difTiempo = tiempo - Double.parseDouble(tiempo_pref);

		if (gps.canGetLocation()) {
			

			if (difDistancia >= 100) {
				
				Log.i("NO TIEMPO", "TIME_DIF->" + difTiempo + "s");
				Log.i("PASS DISTANCIA", " DIST->" + difDistancia + "m");
				updatePreferences(gps.getLatitude(), gps.getLongitude(),
						tiempo);
				enviarUbicacion(gps.getLatitude(), gps.getLongitude());
				
			} else if (difTiempo >= 180) {
				
				Log.i("PASS TIEMPO", "TIME_DIF->" + difTiempo + "s");
				Log.i("NO DISTANCIA", " DIST->" + difDistancia + "m");
				updatePreferences(gps.getLatitude(), gps.getLongitude(),
						tiempo);
				enviarUbicacion(gps.getLatitude(), gps.getLongitude());
				
			} else {
				
				Log.i("NO TIEMPO", "TIME_DIF->" + difTiempo + "s");
				Log.i("NO DISTANCIA", " DIST->" + difDistancia + "m");
			}

		} else {
			Log.i(TAG, "SERVICIO NO HABILITADO");
		}
	}

	public void updatePreferences(double lat, double lon, double time) {
//		
//		SharedPreferences.Editor editor = prefers.edit();
//		editor.putString("latitud_pref", String.valueOf(lat));
//		editor.putString("longitud_pref", String.valueOf(lon));
//		editor.putString("tiempo_pref", String.valueOf(time));
//		editor.commit();
		
		MyPref.updateMyCustomPreferences(
				Util_SharedPreferences.MySHAPRE_TRACKING_SERVICE,
				LATITUD, String.valueOf(lat));
		
		MyPref.updateMyCustomPreferences(
				Util_SharedPreferences.MySHAPRE_TRACKING_SERVICE,
				LONTITUD, String.valueOf(lon));
		
		MyPref.updateMyCustomPreferences(
				Util_SharedPreferences.MySHAPRE_TRACKING_SERVICE,
				TIME, String.valueOf(time));

	}

	private void enviarUbicacion(double lat, double lon) {
		String[] parametros = new String[2];

		parametros[0] = String.valueOf(lat);
		parametros[1] = String.valueOf(lon);

		new enviarUbicacion().execute(parametros);
	}

	// UBICACION - TAREA ASINCRONA
	class enviarUbicacion extends AsyncTask<String, Void, Void> {

		@Override
		protected Void doInBackground(String... params) {
			String recibir = "";

			if (ServicioWorkingSet.recibirServicios) {
				recibir = "Activo";
			} else {
				recibir = "Inactivo";
			}

			String URL = ServerConstants.SERVER_IP + "/unidadMovil/"
					+ ServicioWorkingSet.codigoUnidad + "/ubicacion/"
					+ params[0] + "," + params[1] + "/" + recibir;

			System.out.println("---URL---\n" + URL);
			String respuesta = SigetDriverUtil.connectPost(URL);
			System.out.println("---RESPUESTA---\n" + respuesta);

			try {
				JSONObject jsonResponse = new JSONObject(respuesta);
				int estado = jsonResponse.getInt("estado");

				if (estado == 1) {
					Log.i("Ubicacion SEND OK", "OK");

				} else {
					Log.i("Ubicacion SEND ERROR", "ERROR");
				}

			} catch (JSONException e) {
				e.printStackTrace();
			}

			return null;
		}
	}

}
